# 使用官方Maven镜像作为基础镜像
FROM maven:3.9.9-eclipse-temurin-21-alpine

# 添加一些标签，各种形式
LABEL authors.name="zf"
LABEL authors.age="22"

LABEL authors.addr="北京" authors.gender="male"

LABEL multi.label1="value1"\
      multi.label2="value2"\
      other="value3"

# 设置环境变量
ENV APP_HOME=/app

# 指定工作目录，后续的所有指令中的相对路径都是基于该目录，可以在不同的地方执行多次
# 为了防止基础镜像中制定了其他的 WORKDIR 所造成的错乱，一般都要显示指定工作目录
# WORKDIR /app
WORKDIR $APP_HOME

# 复制当前构建上下文所在目录下的文件 到 镜像中。 复制源代码、pom、settings 文件 到 镜像中
# 当复制的是目录时，会复制目录下的所有内容到镜像的目标目录下
COPY src ./src
# `COPY src ./src` 和 `COPY src ./src/` 效果是一样的

# 复制 pom.xml 文件到镜像中的当前工作路径下
COPY pom.xml .
# 复制自定义的 maven settings文件 到镜像中的当前工作路径下，中并重名
COPY custom_settings.xml ./settings.xml

# 使用mvn编译项目
# 使用 -s 指定使用自定义的 settings.xml 文件
# 使用 -f 指定 pom.xml 文件路径，不指定则，默认使用当前目录下的 pom.xml
# -Dmaven.test.skip=true 跳过测试代码的编译，同时也不执行测试代码
# -DskipTests=true 跳过执行测试，但仍然会编译测试代码
RUN mvn -s ./settings.xml -f ./pom.xml clean package -Dmaven.test.skip=true
# RUN mvn -s ./custom_settings.xml -f ./pom.xml clean package -DskipTests=true

# 编译结果重命名
RUN mv target/*.jar $APP_HOME/ds.jar

# 暴露容器监听的端口，要和容器内应用服务的端口一致，否则请求无法转发到应用上。
# 容器启动后，主机的某个端口映射到容器的8116端口，
# 发送请求给主机的对应端口时，就会把请求转发到容器的8116端口上，由于容器内应用服务的端口是8116，所以请求被转发到应用服务上。
EXPOSE 8116
#EXPOSE 8116/tcp 8888/udp

# 容器启动后，执行该命令启动应用服务
#ENTRYPOINT ["java", "-jar", "ds.jar"]
CMD ["java", "-jar", "ds.jar"]